package it.unipg.bipod.web;

import it.unipg.bipod.applicationLogic.*;

/**
 * LoginBean gestisce le operazioni di autenticazione a BiPoD.<br>
 * Permette di effettuare il login, il logout ed il recupero dei dati.<br>
 * Eventuali messaggi o errori vengono segnalati mediante i metodi forniti da DefaultBean.
 * 
 * @author Lorenzo Porzi
 * @see DefaultBean
 * @see MainBean
 */
public class LoginBean extends DefaultBean {
	// Il MainBean
	private MainBean mainBean;
	
	// Proprietà
	private String nomeUtente;
	private String password;
	private String email;
	
	/**
	 * Imposta quello specificato come MainBean e iniziallizza a stringa vuota tutte
	 * le proprieta'.
	 * 
	 * @param mainBean il mainBean a cui e' collegato questo oggetto.
	 */
	public LoginBean(MainBean mainBean) {
		super();
		
		this.mainBean = mainBean;
		
		setNomeUtente("");
		setPassword("");
		setEmail("");
	}
	
	/* ----------------------------------
	 * Setters e getters per le proprietà
	 * ---------------------------------- */
	
	public void setNomeUtente(String nomeUtente) {
		this.nomeUtente = nomeUtente.trim();
	}
	
	public String getNomeUtente() {
		return nomeUtente;
	}

	public void setPassword(String password) {
		this.password = password.trim();
	}

	public String getPassword() {
		return password;
	}

	public void setEmail(String email) {
		this.email = email.trim();
	}

	public String getEmail() {
		return email;
	}
	
	/* ---------------------
	 * Metodi di navigazione
	 * --------------------- */
	
	/**
	 * Esegue il login al sistema utilizzando i dati forniti.<br>
	 * Imposta corrispondentemente le proprieta' docente e segretario del MainBean.<br>
	 * Questo metodo utilizza le seguenti proprieta' di presentation.ini:
	 * <ul>
	 *   <li><b>msgLoginNonRiuscito</b>: il messaggio visualizzato quando username e password sono errati.</li>
	 *   <li><b>msgErroreGenerico</b>: il messaggio visualizzato quando si verifica un errore sconosciuto.</li>
	 *   <li><b>msgUtenteNonAttivo</b>: il messaggio visualizzato quando un utente non attivo tenta l'autenticazione.</li>
	 *   <li><b>msgUtenteNonRegistrato</b>: il messaggio visualizzato quando un utente non registrato tenta l'autenticazione.</li>
	 * </ul>
	 * 
	 * @return "/pages/segretario-bandi" se si e' loggato un segretario,
	 * "/pages/docente-bandi" se si e' loggato un docente.
	 */
	public String login() {
		try {
			Application app = AuthManager.login(nomeUtente, password);
			
			if (app == null) {
				// Login non riuscito
				addWarnMessage(getSettings().getProperty("msgLoginNonRiuscito"));
				setNomeUtente("");
				setPassword("");
				
				return null;
			}
			
			if (app instanceof SegretarioApplication) {
				// Autenticazione di un segretario
				mainBean.setSegretario(new SegretarioBean((SegretarioApplication)app));
				
				return "/pages/segretario-bandi";
			} else if (app instanceof DocenteApplication) {
				// Autenticazione di un docente
				mainBean.setDocente(new DocenteBean((DocenteApplication)app));
				
				return "/pages/docente-bandi";
			}
			
			// Errore sconosciuto
			addWarnMessage(getSettings().getProperty("msgErroreGenerico"));
			return null;
		} catch (UtenteNonAttivoException e) {
			addWarnMessage(getSettings().getProperty("msgUtenteNonAttivo"));
			return null;
		} catch (UtenteNonRegistratoException e) {
			addWarnMessage(getSettings().getProperty("msgUtenteNonRegistrato"));
			return null;
		} catch (AuthException e) {
			// Errore sconosciuto
			addWarnMessage(getSettings().getProperty("msgErroreGenerico"));
			return null;
		}
	}
	
	/**
	 * Esegue il logout dal sistema azzerando le proprieta'
	 * docente e segretario del MainBean.
	 */
	public void logout() {
		mainBean.resetFields();
	}
	
	/**
	 * Recupera i dati personali dell'utente la cui email e' contenuta nella
	 * proprieta' email di questo oggetto.<br>
	 * Questo metodo utilizza le seguenti proprieta' di presentation.ini:
	 * <ul>
	 *   <li><b>msgRecuperoDatiRiuscito</b>: il messaggio visualizzato quando il recupero riesce.</li>
	 *   <li><b>msgErroreGenerico</b>: il messaggio visualizzato quando si verifica un errore sconosciuto.</li>
	 *   <li><b>msgUtenteNonAttivo</b>: il messaggio visualizzato quando un utente non attivo tenta il recupero.</li>
	 *   <li><b>msgUtenteNonRegistrato</b>: il messaggio visualizzato quando un utente non registrato tenta il recupero.</li>
	 * </ul>
	 */
	public void recuperaDati() {
		try {
			AuthManager.recuperaDati(email);
			
			addInfoMessage(getSettings().getProperty("msgRecuperoDatiRiuscito"));
			
		} catch (UtenteNonAttivoException e) {
			addWarnMessage(getSettings().getProperty("msgUtenteNonAttivo"));
		} catch (UtenteNonRegistratoException e) {
			addWarnMessage(getSettings().getProperty("msgUtenteNonRegistrato"));
		} catch (AuthException e) {
			addWarnMessage(getSettings().getProperty("msgErroreGenerico"));
		}
	}
}
